package com.scnb.proxy.v06;

import java.util.Random;

/**
 * 问题：想要记录坦克的移动时间
 * 最简单的方法：修改代码，记录时间
 * 问题2：如果无法改变源代码呢？
 * v04：使用继承引入耦合
 * v05：使用代理
 * v06：使用多种代理
 * 问题3：当有多种代理的时候，怎么实现代理的组合？使用继承？装饰器？
 * v07：代理的对象改成Movable类型
 */

interface Movable {
    void move();
}

public class Tank implements Movable {
    //模拟坦克移动了一段时间
    @Override
    public void move() {
        System.out.println("Tank moving kakaka ....");

        try {
            Thread.sleep(new Random().nextInt(5000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new TankLogProxy(new TankTimeProxy(new Tank())).move();
    }
}

/**
 * 这里使用的是聚合的方式
 * TankProxy就是Tank的一个代理，它多做了一些自己需要的事情
 */
class TankTimeProxy implements Movable {
    Movable m;

    public TankTimeProxy(Movable m) {
        this.m = m;
    }

    @Override
    public void move() {
        long start = System.currentTimeMillis();
        m.move();
        long end = System.currentTimeMillis();
        System.out.println(end - start);
    }
}

/**
 * 坦克运动日志代理
 */
class TankLogProxy implements Movable {
    Movable m;

    public TankLogProxy(Movable m) {
        this.m = m;
    }

    @Override
    public void move() {
        System.out.println("start moving...");
        m.move();
        System.out.println("stop moving...");
    }
}
